/******************************************************************************
 * 该模块取决于所使用的FPGA上的蜂鸣器，请勿直接套用。
 *
 *  使用 E6 音高，频率 1318Hz，对应 50MHz 的 37936 个周期
 *  beep置低蜂鸣器蜂鸣
*******************************************************************************/
module buzzer #(
  parameter SYS_CLK = 50_000_000,       // unit: MHz
            PITCH   = 1318              // E6 on piano
)(
  input  wire         clk ,
  input  wire         rstn,
  input  wire         ena ,

  output reg          beep
);

localparam  CNT_MAX = SYS_CLK / PITCH,
            DUTY    = CNT_MAX / 10   ;      // 调整占空比（音量）

reg  [15:0] cnt      ;

always @(posedge clk or negedge rstn) begin
  if (~rstn)
    cnt   <=  16'd0;
  else if (ena) begin
    /* verilator lint_off WIDTH */
    if (cnt == CNT_MAX - 1)
      cnt <=  16'd0;
    else
      cnt <=  cnt + 1'b1;
  end else
    cnt   <=  16'd0;  
end

always @(posedge clk or negedge rstn) begin
  if (~rstn)
    beep    <=  1'b1;
  else if (ena) begin
    if(cnt >= DUTY)
      beep  <=  1'b1;
    else
      beep  <=  1'b0;
  end else
    beep    <=  1'b1;
end
endmodule
